﻿/*
 * @Date: 2024-07-10 12:33:28
 * @Auth: 463997479@qq.com
 * @LastEditors: 463997479@qq.com
 * @LastEditTime: 2024-07-17 11:19:14
 * @FilePath: \react-oil-station-manage\src\requestErrorConfig.ts
 */
import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { message } from 'antd';
import { history } from '@umijs/max';
import { getToken, getUser } from './utils/auth';
// 与后端约定的响应数据格式
interface ResponseStructure {
  data?: any;
  code: string | number;
  status?: number | string;
  statusText?: string;
  msg: string;
  uuid?: string;
}

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const errorConfig: RequestConfig = {
  // 错误处理： umi@3 的错误处理方案。
  baseURL: '/prod-api',
  timeout: 5000,
  errorConfig: {
    // 错误接收及处理
    errorHandler: (error: any) => {
      if (error.response) {
        // Axios 的错误
        // 请求成功发出且服务器也响应了状态码，但状态代码超出了 2xx 的范围
        message.error(`Response status:${error.response.status}`);
      } else if (error.request) {
        // 请求已经成功发起，但没有收到响应
        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例，
        // 而在node.js中是 http.ClientRequest 的实例
        message.error('None response! Please retry.');
      } else {
        // 发送请求时出了点问题
        message.error('Request error, please retry.');
      }
    },
  },

  // 请求拦截器
  requestInterceptors: [
    (config: RequestOptions) => {
      // 拦截请求配置，进行个性化处理。
      const url = config?.url;
      if (config.headers) {
        config.headers['Authorization'] = getToken().access_token as string;
        config.headers['company_no'] = getToken().company_no;
        config.headers['login_name'] = getToken().login_name;
      }
      return { ...config, url };
    },
  ],

  // 响应拦截器
  responseInterceptors: [
    (response) => {
      // 拦截响应数据，进行个性化处理
      const { data } = response as unknown as ResponseStructure;

      if (data.code === '200' || data.code === '0') {
        return response as any;
      } else if (data.code === '401' || data.code === '502' || data.code === '403') {
        //清除token
        message.error('请重新登录');
        history.push(`/user/login`);
      } else if (data.code === '500') {
        message.error(data.msg);
        return Promise.reject(new Error(data.msg));
      } else {
        message.error(data.msg);
      }

      if (data?.success === false) {
        message.error('请求失败！');
      }
    },
  ],
};
